package leetcode.editor.cn.dsa01_array;
//给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。

public class ReverseInteger7_3 {
    public static void main(String[] args) {
        ReverseInteger7_3.Solution solution = new ReverseInteger7_3().new Solution();
        // 测试数据
        int[] arr = {123, -123, 120, 1534236469, Integer.MAX_VALUE, Integer.MIN_VALUE};
        for (int i = 0; i < arr.length; i++) {
            int result = solution.reverse(arr[i]);
            System.out.println(arr[i] + "====" + result);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 最优解法 数学解法思路：
         * 1.尝试拿个位数字
         *     对10取模运算得到个位数字
         * 2.让每一位数字变成个位数字
         *     先除以10，再对10取模得到十位数字
         *     循环上述操作
         * 3.将每一位数字计算累加
         *     将上次累加结果*10 + 新数字
         *
         * 注意事项：
         *   边界问题：
         *       从低位到高位处理，最高位结束
         *           最高位 / 10 == 0
         *           最高位 % 10 == 最高位
         *       数值溢出边界：溢出则返回0
         *          用long类型存放，溢出int则返回0
         *          新整数补充最后一位前判断溢出
         *   细节问题：
         *       首位不为0
         *       符号处理
         * @param x 指定整数
         * @return 反转后的整数，或0
         */
        public int reverse(int x) {
            if (x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
                // 整数类型的最小值的绝对值比最大值的绝对值大1
                return 0;
            }
            int sign = x > 0 ? 1 : -1; // 取符号位
            x = x < 0 ? -x : x; // 无论正负，都当成正数
            int result = 0; // 返回结果
            // 1.尝试拿个位数字：对10取模运算
            // 2.让每⼀位数字变成个位数字：先除以10，再对10取模得到十位数字
            int last = 0; // 末位
            while ((last = x % 10) != x) {
                // 3.将每一位数字计算累加：将上次累加结果*10 + 新数字
                result = result * 10 + last;
                x /= 10;
            }
            if (last != 0) { // 此时last是最高位，单独处理
                // long ret = result * 10 + last; 错误
                /*long ret = result;
                ret = ret * 10 + last;
                if (ret > Integer.MAX_VALUE) {
                    result = 0;
                }else {
                    result = (int)ret;
                }*/
                // 判断int溢出（不用 long 类型的做法）
                if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10
                        && last > Integer.MAX_VALUE % 10)) {
                    result = 0;
                } else {
                    result = result * 10 + last;
                }

            }
            return result * sign; // 返回前进行符号处理
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}